package com.tyun.common.aspect;

import com.alibaba.fastjson.JSON;
import com.tyun.common.utils.HttpContextUtils;
import com.tyun.common.utils.IPUtils;
import com.tyun.modules.sys.entity.SysLog;
import com.tyun.modules.sys.entity.SysUser;
import com.tyun.modules.sys.service.ISysLogService;
import org.apache.shiro.SecurityUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.UUID;


/**
 * 系统日志，切面处理类
 * 
 * @author chenshun
 * @email sunlightcs@gmail.com
 * @date 2017年3月8日 上午11:07:35
 */
@Aspect
@Component
public class SysLogAspect {

	@Autowired
	private ISysLogService sysLogService;
	
	@Pointcut("@annotation(com.tyun.common.aspect.BaseLog)")
	public void logPointCut() { 
		
	}
	
	@Before("logPointCut()")
	public void saveSysLog(JoinPoint joinPoint) {
		MethodSignature signature = (MethodSignature) joinPoint.getSignature();
		Method method = signature.getMethod();
		
		SysLog sysLog = new SysLog();
		sysLog.setId(UUID.randomUUID().toString());

		BaseLog syslog = method.getAnnotation(BaseLog.class);
		if(syslog != null){
			// 注解上的描述
			sysLog.setOperation(syslog.value());
		}
		// 请求的方法名
		String className = joinPoint.getTarget().getClass().getName();
		String methodName = signature.getName();
		sysLog.setMethod(className + "." + methodName + "()");
		// 请求的参数
		Object[] args = joinPoint.getArgs();
		if (args != null && args.length > 0) {
			String params = JSON.toJSONString(args[0]);
			sysLog.setParams(params);
		}
		// 获取request
		HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
		// 设置IP地址
		sysLog.setIp(IPUtils.getIpAddr(request));
		// 用户名
		Object principal = SecurityUtils.getSubject().getPrincipal();
		if (principal != null) {
			String userId = ((SysUser) principal).getUserid();
			sysLog.setUserId(userId);
		}
		sysLog.setCreatetime(new Date());
		// 保存系统日志
		sysLogService.insert(sysLog);
	}
	
}
